package com.example.apidocserver.domain.document.service;

import com.example.apidocserver.domain.document.entity.ApiParam;
import com.example.apidocserver.domain.document.entity.ApiParamField;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 接口文档字段表(ApiParamField)表服务接口
 *
 * @author makejava
 * @since 2023-02-24 22:56:57
 */
public interface ApiParamFieldService {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    ApiParamField queryById(Integer id);

    /**
     * 查询所有对象
     *
     * @return 查询结果
     */
    List<ApiParamField> queryAll();

    /**
     * 根据对象查询
     *
     * @param apiParamField 筛选条件
     * @return 查询结果
     */
    List<ApiParamField> queryByEntity(ApiParamField apiParamField);

    /**
     * 新增数据
     *
     * @param apiParamField 实例对象
     * @return 实例对象
     */
    ApiParamField insert(ApiParamField apiParamField);

    /**
     * 修改数据
     *
     * @param apiParamField 实例对象
     * @return 实例对象
     */
    ApiParamField update(ApiParamField apiParamField);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    boolean deleteById(Integer id);

    /**
     * 根据参数说明对象id查询参数字段说明对象分组数据
     *
     * @param paramIds       参数 说明对象数据
     * @param onlyEnableFlag 是否只取启用
     * @return 字段说明按参数分组
     */
    Map<Integer, List<ApiParamField>> queryByParamIds(Collection<Integer> paramIds, boolean onlyEnableFlag);


    /**
     * 新增字段说明对象
     *
     * @param noRltFieldList 字段说明对象
     * @param apiId          接口id
     */
    void insertNewAuto(List<ApiParamField> noRltFieldList, Integer apiId);

    /**
     * 新增参数与字段说明关系
     *
     * @param noRltFieldList 字段信息集合
     * @param orderResetFlag 是否重新设置排序值
     */
    void createRlt(List<ApiParamField> noRltFieldList, boolean orderResetFlag);

    /**
     * 增加或修改参数字段信息
     *
     * @param paramDescVo 参数和字段信息
     */
    void upsertField(ApiParam paramDescVo);

    /**
     * 收缩相似字段
     *
     * @param likeStr 字段
     * @param spaceId 工作空间id
     * @return 字段集合
     */
    List<ApiParamField> findLikeFields(String likeStr, Integer spaceId);

    /**
     * 根据uniKey查询接口数据
     *
     * @param field 字段对象
     * @return 字段对象
     */
    ApiParamField findByUinKey(ApiParamField field);

    /**
     * 查询工作空间所有字段说明
     *
     * @param spaceId 工作空间id
     * @return 字段说明集合
     */
    List<ApiParamField> findBySpaceId(Integer spaceId);

    /**
     * 修改单个字段说明
     *
     * @param field 字段说明参数
     */
    void upsertOne(ApiParamField field);

    /**
     * 批量插入字段信息和绑定关系
     *
     * @param apiParamList 参数说明集合
     * @param userId           用户id
     * @param now              当前时间
     */
    void insertParamFieldBatch(List<ApiParam> apiParamList, Integer userId, Date now);
}
